
 /* ControleNaoJogoServidor.java
  *
  * Created on 14 de Dezembro de 2006, 00:32
  *
  * To change this template, choose Tools | Template Manager
  * and open the template in the editor.
  */

package magchess10S.rn;

import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Vector;

import magchess10.ClassesSO.IConnClient;
import magchess10S.ClassesPE.AcessoBD;
import magchess10S.ClassesSO.IConnServidor;

/**
 *
 * @author User
 */
public class ControleNaoJogoServidor extends UnicastRemoteObject implements IConnServidor, Serializable  {
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DescritorMesa c_descritorMesa;
    private AcessoBD c_AcessoBD;
    private int c_portaAtual=1098;
    private Hashtable c_rmiNaoJogoCliente;
    private LinkedList c_rmiNaoJogoClientes;
    
    
    public ControleNaoJogoServidor() throws RemoteException {
        super();
        c_rmiNaoJogoCliente = new Hashtable();
        c_rmiNaoJogoClientes = new LinkedList();
        c_descritorMesa = new DescritorMesa();
        c_AcessoBD = new  AcessoBD();
        
        
    }
    public boolean consultarBD(String p_apelido, String p_senha) throws RemoteException {
        return c_AcessoBD.consultaBD(p_apelido,p_senha);
    }
    private boolean checarMesaCompleta() {
        return c_descritorMesa.checarMesaCompleta();
    }
    public boolean inserirBD(String p_apelido,String p_senha, String p_primeiroNome,String p_ultimoNome , String p_email) throws RemoteException {
        
        c_AcessoBD.InserirBD(p_apelido,p_senha,p_primeiroNome,p_ultimoNome,p_email);
        return true;
    }
    public void atualizaTempoMesa(int p_tempoJogo) throws RemoteException {
        c_descritorMesa.setTempoMesa(p_tempoJogo);
        solicitaAtualizacaoTempoTelaMesa(p_tempoJogo);
        if (checarMesaCompleta())
            SolicitarRedirecionamentoTelaJogo();
    }
    public void atualizaJogadoresMesa(int p_posicaoJogador, String p_nomeJogador)throws RemoteException{
        c_descritorMesa.setJogadorMesa(p_posicaoJogador,p_nomeJogador);
        solicitaAtualizacaoJogadorTelaMesa(p_nomeJogador);
        if (checarMesaCompleta() && getDescritorMesa().getTempoMesa() != 0 )
           SolicitarRedirecionamentoTelaJogo();
        
        
    }
    
    
    private void  solicitaAtualizacaoTempoTelaMesa(int p_tempoJogo) {
        for (int i=0; i< c_rmiNaoJogoClientes.size(); i++ )
            try{
                IConnClient l_rmiNaoJogoC = (IConnClient) c_rmiNaoJogoClientes.get(i);
                l_rmiNaoJogoC.atualizarTempoTelaMesa(p_tempoJogo);
                
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        
    }
    
    private String getNomeJogadorPosicao(int p_posicao) {
        return c_descritorMesa.getNomeJogadorPosicao(p_posicao);
    }
    
    public String [] getStatusMesa()  {
        return getDescritorMesa().getJogadoresMesa();
    }

    public int getTempoMesa()  {
        return getDescritorMesa().getTempoMesa();
    }
    

    
    private void SolicitarRedirecionamentoTelaJogo() {
        
        for (int i=0; i< c_rmiNaoJogoClientes.size(); i++ )
            try{
                IConnClient l_rmiNaoJogoC = (IConnClient) c_rmiNaoJogoClientes.get(i);
                l_rmiNaoJogoC.redirecionarTelaJogo(getStatusMesa(),getTempoInicial());
               ControleJogoServidor l_controleJogoServidor = new ControleJogoServidor (c_descritorMesa);
            } catch (Exception e) {
                System.err.println(e.toString());
                e.printStackTrace();
            }
    }
    
    private void solicitaAtualizacaoJogadorTelaMesa(String p_nomeJogador) {
        for (int i=0; i< c_rmiNaoJogoClientes.size(); i++ )
            try{
                IConnClient l_rmiNaoJogoC = (IConnClient) c_rmiNaoJogoClientes.get(i);
                l_rmiNaoJogoC.atualizarJogadoresTelaMesa(getStatusMesa());
                
            } catch (Exception e) {
                System.err.println(e.toString());
            }
    }
    
    
    public void registrarClienteServidor(String p_ipCliente, String p_nomeCliente) {
        try {
            c_rmiNaoJogoCliente.put(p_nomeCliente,(IConnClient) Naming.lookup("rmi://" + p_ipCliente + ":" + c_portaAtual + "/" + p_nomeCliente ));
            c_rmiNaoJogoClientes.add((IConnClient) Naming.lookup("rmi://" + p_ipCliente + ":" + c_portaAtual-- + "/" + p_nomeCliente ));
            
            
        } catch (Exception e){
            System.out.println(e.toString());
        }
    }
    
    public int getPortaAtual() {
        return c_portaAtual;
    }
    
    protected int getTempoInicial() {
        return getDescritorMesa().getTempoMesa();
    }
    
    protected DescritorMesa getDescritorMesa() {
        return c_descritorMesa;
    }

    
    
    
    
}




